"""
wait方法的使用： concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED):

等待 Future 实例完成，这些实例可能由多个不同的执行器实例创建，通过 fs 指定这些 Future 实例 。

返回具名元组，该元组有两个元素，每个元素都是一个集合。第一个元素名叫 done，该集合包括已完成的 futures；第二个元素名叫 not_done，该集合包括未完成的 futures。

timeout 用来控制返回之前等待的最大秒数，可以是整数或者浮点数。如果不指定或为 None，不限制等待时间。
return_when 指明函数何时应该返回。它必须是下列常量之一：
FIRST_COMPLETED：函数在任意一个 future 完成或者被取消时返回。
FIRST_EXCEPTION：函数在任意一个 future 因为异常而结束时返回。如果没有 future 抛出异常，它等价于 ALL_COMPLETED。
ALL_COMPLETED：当所有 future 完成或者被取消时函数才会返回。

"""
from concurrent.futures import ThreadPoolExecutor, wait
import requests


def thread_run(url):
    try:
        re = requests.get(url=url, timeout=30)
        re.raise_for_status()
        re.encoding = re.apparent_encoding
        return re.text
    except:
        return


if __name__ == "__main__":
    with ThreadPoolExecutor(max_workers=2) as executor:
        urls = [
            "https://blog.csdn.net/weixin_41599977/article/details/92404112",
            "https://blog.csdn.net/weixin_41599977/article/details/91048654",
            "https://blog.csdn.net/weixin_41599977/article/details/90300773"
        ]
        futures = []
        for url in urls:
            futures.append(executor.submit(thread_run, url))
        # wait方法会返回一个tuple，元组中包含两个set，一个是completed，另一个是uncompleted
        # 使用wait方法的一个优势就是获得更大的自由度，它接收三个参数FIRST_COMPLETED, FIRST_EXCEPTION 和ALL_COMPLETE，
        # 默认设置为ALL_COMPLETED。
        # print(wait(tasks))  # 程序会阻塞在这里，直到线程池里的子线程全部完成任务
        print(wait(futures, return_when="FIRST_COMPLETED").done)  # 主线程并不会等待线程池里面的任务执行完，而是继续往下执行
        print("The main thread is running!")
